import java.util.*;

public class Main {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        int i = 0, j = 0;
        Set<Character> set = new HashSet<>();
        int maxLen = 0;
        while (j < n) {
            char c = s.charAt(j);
            // 如果重复，则不断移除左侧字符，直到移除重复字符
            while (set.contains(c)) {
                set.remove(s.charAt(i));
                i++;
            }
            // 添加当前字符，并更新窗口长度
            set.add(c);
            maxLen = Math.max(maxLen, j - i + 1);
            j++;
        }
        return maxLen;
    }

    public int maxSubArray(int[] nums) {
        int maxValue = nums[0];
        int n = nums.length;
        int dp[] = new int[n];
        dp[0] = nums[0];
        for (int i = 1; i < n; i++) {
            dp[i] = Math.max(dp[i], dp[i - 1] + nums[i]);
            maxValue = Math.max(dp[i], maxValue);
        }
        return maxValue;
    }
    //用栈来实现一个队列  栈的特性是后进先出

    //字符串相乘
    public String multiply(String num1, String num2) {
        if (num2.equals("0") || num1.equals("0")) {
            return "0";
        }
        int n = num1.length();
        int m = num2.length();
        int[] arr = new int[n + m];
        //arr 的长度
        for (int i = n - 1; i >= 0; i--) {
            int x = num1.charAt(i) - '0';
            for (int j = m - 1; j >= 0; j--) {
                int y = num2.charAt(j) - '0';
                arr[i + j + 1] += x * y;
            }
        }
        //对于arr[i] 从后往前走
        for (int i = arr.length - 1; i > 0; i--) {
            arr[i - 1] += arr[i] / 10;
            arr[i] = arr[i] % 10;
        }
        //进行拼接
        StringBuffer sb = new StringBuffer();
        if (arr[0] != 0) {
            sb.append(arr[0]);
        }
        for (int i = 1; i < arr.length; i++) {
            sb.append(arr[i]);
        }
        return sb.toString();
    }

    public int[] twoSum(int[] nums, int target) {
        // 用map的结构来实现o1的时间复杂度
        Map<Integer, Integer> map = new HashMap<>();
        int n = nums.length;
        //key 存储的是num[i] -target

        //最弱智的就是双层的for循环来遍历
        for (int i = 0; i < n; i++) {
            int temp = target - nums[i];
            if (map.containsKey(temp)) {
                return new int[]{map.get(temp), i};
            } else {
                map.put(nums[i], i);
            }
        }
        return null;
    }

    //重排序 然后放入到map中 存储
    // mapkey是String
    // value 是List<String> 列表
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for (int i = 0; i < strs.length; i++) {
            char[] arr = strs[i].toCharArray();
            Arrays.sort(arr);
            //时间复杂度是nlogn *n的
            String key = new String(arr);
            //如果为空 默认是新建一个new ArrayList结构
            List<String> list = map.getOrDefault(key, new ArrayList<>());

            list.add(strs[i]);

            map.put(key, list);
        }
        //返回list的结构
        return new ArrayList<List<String>>(map.values());
    }

    public static void main(String[] args) {

    }
}
